package com.test.collections;

import org.junit.Test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by lenovo on 2017/4/7.
 *
 使用 entrySet 遍历 Map 类集合 KV，而不是 keySet 方式进行遍历。
 说明：keySet 其实是遍历了 2 次，一次是转为 Iterator 对象，另一次是从 hashMap 中取出 key
 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中，效率更
 高。如果是 JDK8，使用 Map.foreach 方法。
 正例：values()返回的是 V 值集合，是一个 list 集合对象；keySet()返回的是 K 值集合，是
 一个 Set 集合对象；entrySet()返回的是 K-V 值组合集合。
 11.【推荐】高度注意 Map 类集合 K/V 能不能存储 null 值的情况，如下表格：
 集合类 Key Value Super 说明
 Hashtable 不允许为 null 不允许为 null Dictionary 线程安全
 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 线程局部安全
 TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全
 HashMap 允许为 null 允许为 null AbstractMap 线程不安全
 反例：很多同学认为 ConcurrentHashMap 是可以置入 null 值。在批量翻译场景中，子线程分
 发时，出现置入 null 值的情况，但主线程没有捕获到此异常，导致排查困难。
 */
public class ForeachMap {

    @Test
    public void PrintKeyAndValue(){
        Map<Integer,String> map1 = new HashMap<Integer,String>();
        map1.put(1,"sss");
        Iterator it = map1.entrySet().iterator();
        while (it.hasNext()){
            Map.Entry entry = (Map.Entry)it.next();
            System.out.println("key"+entry.getKey()+"value"+entry.getValue());
        }
    }

}
